/**
***************************************************************
*@file  can.h 
*@brief can.h 
*@author 花满楼
*@date     2020-7-1 
*@version  V1
*@note CAN的函数和变量定义，其中包含于台达和科列通讯的结构体
***************************************************************
*/
#ifndef __CAN_H
#define __CAN_H
#include "sys.h"
#include "protect.h"
///////////////////////////////////////

////////////////////////////////////////////////////////////


void MX_CAN1_Init(void);
void MX_CAN2_Init(void);
void can_init(CAN_HandleTypeDef* _hcan);
///////////////////////////////////////////

/**@name    电芯信息
* @{
*/
#ifndef CELL_NUM
	#define CELL_NUM 54		//项目中有54个电芯
#endif

#ifndef TEMP_PER_NUM
	#define TEMP_PER_NUM 2		//项目中单个采集芯片采集温度数量
#endif
/**@} */
/**@name    CAN1接收RX0中断使能
* @{
*/
#define CAN1_RX0_INT_ENABLE 1       ///<0,不使能;1,使能.
#define CAN2_RX0_INT_ENABLE 1       ///<0,不使能;1,使能.
/**@} */

/**@name    CAN通讯的ID
* @{
*/                                
#define  M2M_0        0x180040F0      ///<ID pack固有信息，包括电芯数量、电芯材质等
#define  M2M_1        0x180140F0      ///<ID 动力电池的综合信息
#define  M2M_2        0x180240F0      ///<ID 继电器状态和历史SOC、SOH信息
#define  M2M_3        0x180340F0      ///<ID 电压最值信息
#define  M2M_4        0x180440F0      ///<ID 温度最值信息
#define  M2M_5        0x180540F0      ///<ID 电池电压信息，一共15组，地址依次向后
#define  M2M_6        0x180640F0      ///<ID 电池电压信息
#define  M2M_7        0x180740F0      ///<ID 电池电压信息
#define  M2M_8        0x180840F0      ///<ID 电池电压信息
#define  M2M_9        0x180940F0      ///<ID 电池电压信息
#define  M2M_10       0x180A40F0      ///<ID 电池电压信息
#define  M2M_11       0x180B40F0      ///<ID 电池电压信息
#define  M2M_12       0x180C40F0      ///<ID 电池电压信息
#define  M2M_13       0x180D40F0      ///<ID 电池电压信息
#define  M2M_14       0x180E40F0      ///<ID 电池电压信息
#define  M2M_15       0x180F40F0      ///<ID 电池电压信息
#define  M2M_16       0x181040F0      ///<ID 电池电压信息
#define  M2M_17       0x181140F0      ///<ID 电池电压信息
#define  M2M_18       0x181240F0      ///<ID 电池电压信息
#define  M2M_19       0x181340F0      ///<ID 电池电压信息
#define  M2M_20       0x181440F0      ///<ID 电池温度信息，一共3组，地址依次向后
#define  M2M_21       0x181540F0      ///<ID 电池温度信息
#define  M2M_22       0x181640F0      ///<ID 电池温度信息
#define  M2M_23       0x182640F0      ///<ID 电池均衡信息
#define  M2M_24       0x182740F0      ///<ID 故障告警和保护信息
#define  M2M_25       0x182840F0      ///<ID 充放电状态持续信息

#define  PC2M_0       0x1800F040      ///<ID PC的调试信息


/**@} */

extern u32 reg_time_count;  ///<通讯超时计数

extern CAN_HandleTypeDef   CAN2_Handler;   ///<CAN2句柄
extern CAN_HandleTypeDef   CAN1_Handler;   ///<CAN2句柄


u32 Message_Handle(CanRxMsgTypeDef *RxMessage);

/**********************************上传PC数据***********************************/
/**
@name    上传PC数据
* @{
*/ 

typedef struct      ///<声明一个存储PACK固定信息的结构体
{
    u8 CellNum;    		//pack内电芯数量
    u8 TempNum; 	 	//pack中温度传感器数量
    u8 CellMaterials;   //电芯 材质；0：三元；1：磷酸铁锂；2：钛酸锂；3：锰酸锂；4：铅酸；5：其它
} Pack_Message_TypeDef;
extern Pack_Message_TypeDef Pack_Message;

typedef struct      ///<声明一个存储综合信息的结构体
{
    u16 Pack_Vol; 		//pack 总电压
    s16 Pack_Cur; 		//pack string电流  充电为正，放电为负
    u8 Pack_SOC;  		//pack SOC
    u8 Pack_SOH;  		//pack SOH
    u8 Pack_Alm; 		//pack 总告警
} Pack_Mes_TypeDef;
extern Pack_Mes_TypeDef Pack_Mes_Tol;

typedef struct      ///<声明一个存储继电器状态和历史SOC、SOH的结构体
{
    u8 BatState; 		//动力电池综合状态
		union
		{
			struct
			{
				u8 ChaRlyStr			:2; //充电继电器
				u8 DisRlyStr			:2; //放电继电器
				u8 PreRlyStr			:2;	//预充继电器
				u8 RSVD					:2;	
			}Bit;
			u8 Byte;
		}RlyStr;
    u8 BatLife; 		//通讯生命信息
		u8 SocHistory;	//SOC的历史信息
		u8 SohHistory;	//SOH的历史信息
} Pack_Rly_TypeDef;
extern Pack_Rly_TypeDef Pack_Rly_Status;

typedef struct     ///<声明一个机柜电芯电压最值的结构体
{
    u16 Max_Cell_Volt;  //最高电芯电压
    u16 Min_Cell_Volt;  //最低电芯电压
    u8 Max_Volt_Module; //最高电压对应模组编号
    u8 Max_Volt_No; 	//最高电压对应电芯编号
    u8 Min_Volt_Module; //最低电压对应模组编号
    u8 Min_Volt_No; 	//最低电压对应电芯编号
} Pack_Vol_TypeDef;
extern Pack_Vol_TypeDef  CELL_Vol_Maxi;

typedef struct       ///<声明一个机柜电芯温度最值以及母线电阻、继电器状态的结构体
{
    s8 Max_Cell_Tem; 	//最高电芯温度
    s8 Min_Cell_Tem; 	//最低电芯温度
    u8 Max_Tem_Module;  //最高温度对应模组编号
    u8 Max_Tem_No; 		//最高温度对应电芯编号
    u8 Min_Tem_Module;  //最低温度对应模组编号
    u8 Min_Tem_No; 		//最低温度对应电芯编号
    union
		{
			struct
			{
				u8 PosRes			:4; //正母线电阻
				u8 NegRes			:4; //负母线电阻
			}Bit;
			u8 Byte;
		}Insul_Res;
} Pack_Tem_TypeDef;
extern Pack_Tem_TypeDef Pack_Tem_Maxi;

typedef struct      ///<声明一个存储电池电压信息的结构体
{
    u16 Cell_1; //模组电压，偏移量0，数据范围0~5V
    u16 Cell_2; //模组电压，偏移量0，数据范围0~5V
    u16 Cell_3; //模组电压，偏移量0，数据范围0~5V
    u16 Cell_4; //模组电压，偏移量0，数据范围0~5V

} Cell_Vol_TypeDef;
extern Cell_Vol_TypeDef Cell_Vol_Data[16];	//4*16=64个cell

typedef struct      ///<声明一个存储电池温度信息的结构体
{
    s16 Temp_1; //模组温度，偏移量-20，数据范围-20~+120C
    s16 Temp_2; //模组温度，偏移量-20，数据范围-20~+120C
    s16 Temp_3; //模组温度，偏移量-20，数据范围-20~+120C
    s16 Temp_4; //模组温度，偏移量-20，数据范围-20~+120C

} Cell_Temper_TypeDef;
extern Cell_Temper_TypeDef Cell_Temper_Data[3];	//一共10个温度检测点

typedef struct      ///<声明一个存储电池均衡信息的结构体
{
    u16 Cell_banl;    //第一组电芯均衡状态
    u16 Cell_ban2;    //第二组电芯均衡状态
    u16 Cell_ban3;    //第三组电芯均衡状态
    u16 Cell_ban4;    //第四组电芯均衡状态

} Cell_Banlance_TypeDef;
extern Cell_Banlance_TypeDef Cell_Banl_Flag;


typedef struct      ///<声明一个机柜充放电持续时间的结构体
{
		u16 Char_Quantity;		//完成充电容量
		u16 Dischar_Quantity;	//完成放电容量
    u16 Char_Remain; 			//预估剩余充电时间
    u16 Dischar_Remain; 		//预估剩余放电时间
} Remain_Mes_TypeDef;
extern Remain_Mes_TypeDef Remain_Mes;
/**@} */


/***************************************************/


u8 CAN1_Mode_Init(u32 tsjw, u32 tbs2, u32 tbs1, u16 brp, u32 mode);    ///<CAN初始化
u8 CAN2_Send_Msg(u8 len);         ///<发送数据
u8 CAN1_Receive_Msg(u8 *buf);    ///<接收数据

u8 CAN2_Mode_Init(u32 tsjw, u32 tbs2, u32 tbs1, u16 brp, u32 mode);    		///<CAN初始化

u8 CAN1_Send_PackMeg(Pack_Message_TypeDef *msg, u32 CAN_ID, u8 len);    	///<发送pack固有状态信息
u8 CAN1_Send_TotMeg(Pack_Mes_TypeDef *msg, u32 CAN_ID, u8 len);    			///<CAN1发送pack总压、总流、SOC等数据
u8 CAN1_Send_RlyMeg(Pack_Rly_TypeDef *msg, u32 CAN_ID, u8 len);        		///<CAN1发送电池组继电器等状态信息
u8 CAN1_Send_VolMeg(Pack_Vol_TypeDef *msg, u32 CAN_ID, u8 len);    			///<CAN1发送电压最值
u8 CAN1_Send_TemMeg(Pack_Tem_TypeDef *msg, u32 CAN_ID, u8 len);   			///<CAN1发送温度最值
u8 CAN1_Send_CellV(Cell_Vol_TypeDef *msg, u32 CAN_ID, u8 len);    			///<CAN1发送电芯电压数据
u8 CAN1_Send_CellT(Cell_Temper_TypeDef *msg, u32 CAN_ID, u8 len);     		///<CAN1发送电芯温度数据
u8 CAN1_Send_Banl(Cell_Banlance_TypeDef *msg, u32 CAN_ID, u8 len);    		///<CAN1发送电芯均衡数据
u8 CAN1_Send_AlmMeg(_Alarm_RegisterGroup *msg, u32 CAN_ID, u8 len);       	///<CAN1发送模组错误数据
u8 CAN1_Send_RemTimeMeg(Remain_Mes_TypeDef *msg, u32 CAN_ID, u8 len);     	///<CAN1发送pack持续充放电信息
u8 CAN1_Send_DebugMsg(u16 *msg, u32 CAN_ID, u8 len);     					///<CAN1发送pack持续debug信息

void CAN1_Receive_DebugMsg(CanRxMsgTypeDef *CAN_RxMessage); 

void CAN1_SendToPack(u8 Addr);	//发送数据到其他pack或上位机

u8 CAN2_Receive_Msg(u8 *buf);       ///<接收数据
uint8_t CAN_WriteData(CanTxMsgTypeDef *TxMessage);
/************************************以下为调试上位机临时使用******************************************/
/**
@name    以下为调试上位机临时使用
* @{
*/ 

/**@} */
#endif
